1 // //Complejidad: O(E log V)
2 // ¡Si hay ciclos de peso negativo, el algoritmo se queda
3 // en un ciclo infinito!
4 // Usar Bellman-Ford en ese caso.
8 edge(int t
, int w
) : to(t
), weight(w
) {}
9 bool operator < (const edge
&that
) const {
10 return weight
> that
.weight
;
14 vector
<edge
> g
[MAXNODES
];
15 // g[i] es la lista de aristas salientes del nodo i. Cada una
16 // indica hacia que nodo va (to) y su peso (weight). Para
17 // aristas bidireccionales se deben crear 2 aristas dirigidas.
19 // encuentra el camino más corto entre s y todos los demás
21 int d
[MAXNODES
]; //d[i] = distancia más corta desde s hasta i
22 int p
[MAXNODES
]; //p[i] = predecesor de i en la ruta más corta
23 int dijkstra(int s
, int n
){
24 //s = nodo inicial, n = número de nodos
25 for (int i
=0; i
<n
; ++i
){
30 priority_queue
<edge
> q
;
33 int node
= q
.top().to
;
34 int dist
= q
.top().weight
;
37 if (dist
> d
[node
]) continue;
39 //dist es la distancia más corta hasta t.
40 //Para reconstruir la ruta se pueden seguir
41 //los p[i] hasta que sea -1.
45 for (int i
=0; i
<g
[node
].size(); ++i
){
46 int to
= g
[node
][i
].to
;
47 int w_extra
= g
[node
][i
].weight
;
49 if (dist
+ w_extra
< d
[to
]){
50 d
[to
] = dist
+ w_extra
;
52 q
.push(edge(to
, d
[to
]));